Service Catalogの製品タイプにTERRAFORM_OPEN_SOURCEが追加されたので試してみた
AWS事業本部コンサルティング部のイシザワです。
最近のアップデートでTerraformで書かれたコードをService Catalogの製品として起動できるようになりました。
本記事では公式のGetting startedを参考に、製品を起動するまでの流れを確かめたいと思います。
やってみた
Terraform Reference Engineのプロビジョニング
まずは製品を登録する管理アカウントにTerraform Reference Engineをデプロイする必要があります。
今回はCloud9上でコマンドを実行してプロビジョニングをします。現時点のCloud9には動作要件のPython3.9が入っていないので先にPython3.9をインストールする必要があります。
参考) 【AWS】素の Cloud9 に Python 3.9 をインストールする
他にもjqが必要なのでインストールします。
$ sudo yum install jq -y
Python3.9とjqがインストールされたら、以下のコマンドを実行してインストールスクリプトを実行します。
$ git clone https://github.com/aws-samples/service-catalog-engine-for-terraform-os.git $ cd service-catalog-engine-for-terraform-os $ ./bin/bash/deploy-tre.sh -r ap-northeast-1
スクリプトの実行が完了すると、以下のようにスタックSAM-TRE
とBootstrap-TRE
がデプロイされていることが確認できます。
製品の登録
このページにあるsimple-s3-bucket.tar.gzを製品として登録します。
「Service Catalog > 製品リスト > 製品を作成」で製品の作成を行います。以下の設定で製品を作成します。指定の無い項目は空欄でOKです。
項目名 | 値 |
---|---|
製品タイプ | Terraform のオープンソース |
製品名 | Simple S3 Bucket |
所有者 | <適当な値> |
バージョンソース | テンプレートファイルをアップロード(simple-s3-bucket.tar.gzをアップロード) |
バージョン名 | v1 |
続いてポートフォリオを作成します。 「Service Catalog > ポートフォリオ > ポートフォリオの作成」で以下の設定のポートフォリオを作成します。
項目名 | 値 |
---|---|
ポートフォリオ名 | S3 Bucket |
所有者 | <適当な値> |
作成したポートフォリオに製品「Simple S3 Bucket」を追加します。追加する際に「起動制約を今すぐ作成する」のチェックを外します。
起動制約の設定
以下のPolicyDocumentを持つIAMポリシーS3ResourceCreationAndArtifactAccessPolicy
を作成します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "*", "Condition": { "StringEquals": { "s3:ExistingObjectTag/servicecatalog:provisioning": "true" } } }, { "Action": [ "s3:CreateBucket*", "s3:DeleteBucket*", "s3:Get*", "s3:List*", "s3:PutBucketTagging" ], "Resource": "arn:aws:s3:::*", "Effect": "Allow" }, { "Action": [ "resource-groups:CreateGroup", "resource-groups:ListGroupResources", "resource-groups:DeleteGroup", "resource-groups:Tag" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "tag:GetResources", "tag:GetTagKeys", "tag:GetTagValues", "tag:TagResources", "tag:UntagResources" ], "Resource": "*", "Effect": "Allow" } ] }
上から順に
- Service Catalogが製品テンプレートを取得するための権限
- S3バケットをプロビジョニングするための権限
- Service Catalogがリソースグループを操作するための権限
- Service Catalogがタグを管理するための権限
となっています。
このIAMポリシーをアタッチした、起動制約用のIAMロールSCLaunch-S3product
を作成します。ロール名は必ずSCLaunch-
始まりでなければなりません。
このIAMロールの信頼ポリシーは以下のように設定します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GivePermissionsToServiceCatalog", "Effect": "Allow", "Principal": { "Service": "servicecatalog.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<管理アカウントのアカウントID>:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": [ "arn:aws:iam::<管理アカウントのアカウントID>:role/TerraformEngine/TerraformExecutionRole*", "arn:aws:iam::<管理アカウントのアカウントID>:role/TerraformEngine/ServiceCatalogTerraformOSParameterParserRole*" ] } } } ] }
上から順に
- Service Catalogへのアクセス許可
- Terraform Reference Engineへのアクセス許可
となっています。
「Service Catalog > ポートフォリオ > S3 Bucket > 制約を作成」より起動制約の設定を行います。以下の設定で起動制約を作成します。
項目名 | 値 |
---|---|
製品 | Simple S3 Bucket |
制約タイプ | 起動 |
メソッド | ロール名を入力 |
ロール名 | SCLaunch-S3product |
製品の起動
「Service Catalog > ポートフォリオ > S3 Bucket > アクセス権の付与」から、ポートフォリオのアクセス許可を設定します。製品を起動を許可するIAMプリンシパルを設定します。
アクセス権を設定したら「Service Catalog > 製品」で表示される製品の一覧に「Simple S3 Bucket」が追加されています。「Simple S3 Bucket」を選択して「製品を起動」をクリックすることで製品の起動設定を行います。
今回は以下の起動設定で製品を設定します。
項目名 | 値 | 備考 |
---|---|---|
プロビジョニングされた製品の名前 | <名前を生成にチェック> | |
製品バージョン | v1 | |
bucket_name | test-simple-s3-bucket-<アカウントID> | Terraformコードのパラメータ |
起動の進行状況はStep FunctionsのステートマシンManageProvisionedProductStateMachine
の「実行」から確認できます。
起動が完了するとプロビジョニングされた製品のリソースタブよりS3バケットが作成されたことが確認できます。Terraformで製品を作成した場合各種リソースはAWSリソースグループに追加されるようです。
出力にはTerraformコードで指定された出力とリソースグループのARNが表示されます。
製品の更新も行うこともできます。更新の際もステートマシンManageProvisionedProductStateMachine
で更新の進行状況を確認することができます。
製品の削除
プロビジョニングされた製品のページより、製品の削除を行うことができます。ステートマシンTerminateProvisionedProductStateMachine
で削除の進行状況を確認することができます。
CFnテンプレートから作成された製品との違い
製品タイプCLOUD_FORMATION_TEMPLATE
の製品との違いを、今回の検証で気づいた範囲で列挙します。
- 事前にTerraform Reference Engineのプロビジョニングが必要
- テンプレートファイルを構成ファイル単体でなくtar.gzファイルで指定する
- 起動制約の設定が必須
- 現時点(2023/04/05)で起動制約以外の制約を適用することができない
- 起動制約に設定するIAMロールに必須となる権限が増えている
- リソースグループを操作するための権限が必須
- 起動制約に設定するIAMロールの信頼性ポリシー
- Service CatalogだけでなくTerraform Reference EngineからもAssumeRoleされる
- 作成されたリソースがリソースグループに追加される
まとめ
TerraformのコードをService Catalogの製品として起動するまでの流れを確認しました。 公式のチュートリアルによると製品の共有も可能とのことなので、また別の機会に試してみたいと思います。